package shujia.day18;

import java.lang.reflect.Constructor;

/*
    在已经学习了如何获取一个类的Class对象之后，我们就可以学习如何获取一个类中的任意一个任意修饰符的
        构造方法 Constructor
        成员变量 Field
        成员方法 Method

    在反射的眼里，将这三种成员，看作三种不同的事物，java也提供了三个不同的类来描述这三个事物

    通过反射获取class对象中的构造方法并使用
 */
public class ClassDemo2 {
    public static void main(String[] args) throws Exception{
        Class<?> studentClass = Class.forName("shujia.day18.Student");

        //获取公共public的构造方法
        //Constructor<T> getConstructor(Class<?>... parameterTypes)
        //获取某一个构造方法，根据参数列表来获取
        //获取一个参数列表为一个int类型的构造方法
        Constructor<?> c1 = studentClass.getConstructor(int.class);
        System.out.println("c1: "+c1);

        //获取一个无参的构造方法
//        Constructor<?> c2 = studentClass.getConstructor(int.class, String.class);
//        System.out.println("c2: "+c2);
        Constructor<?> c2 = studentClass.getDeclaredConstructor();
        System.out.println("c2: "+c2);
        Constructor<?> c3 = studentClass.getDeclaredConstructor(int.class, String.class);
        System.out.println("c3: "+c3);
        Constructor<?> c4 = studentClass.getDeclaredConstructor(int.class);
        System.out.println("c4: "+c4);
        //获取任意修饰符的构造方法
        //public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
        //Constructor类中有一个方法可以根据一个构造方法，创建对应类的对象
        Object o1 = c4.newInstance(1001);
        System.out.println(o1);

        c2.setAccessible(true); // 暴力访问
        Object o2 = c2.newInstance();
        System.out.println(o2);

        System.out.println("----------------------------------");
        //获取类中所有的公共的public修饰的构造方法
//        Constructor<?>[] constructors = studentClass.getConstructors();
//        for (Constructor<?> constructor : constructors) {
//            System.out.println(constructor);
//        }

        Constructor<?>[] declaredConstructors = studentClass.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }


    }
}
